#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// common.c（公共工具）
int get_version() { return 100; }  // 业务 A 和 B 都可能调用


/**
 * 字符串切割函数
 * @param str 待分割的字符串
 * @param delim 分隔符
 * @param count 返回分割后的子字符串数量
 * @return 返回分割后的字符串数组，使用完后需要手动释放内存
 */
char** split(const char* str, char delim, int* count) {
    // 检查参数有效性
    if (str == NULL || count == NULL) {
        return NULL;
    }
    
    // 计算需要分割的段数
    int segments = 1;
    const char* p = str;
    while (*p) {
        if (*p == delim) {
            segments++;
        }
        p++;
    }
    
    // 分配指针数组内存
    char** result = (char**)malloc(segments * sizeof(char*));
    if (result == NULL) {
        *count = 0;
        return NULL;
    }
    
    // 开始分割
    int index = 0;
    const char* start = str;
    const char* end = str;
    
    while (*end) {
        if (*end == delim) {
            // 计算当前段长度
            int length = end - start;
            // 分配内存并复制字符串
            result[index] = (char*)malloc((length + 1) * sizeof(char));
            if (result[index] == NULL) {
                // 内存分配失败，释放已分配的内存
                for (int i = 0; i < index; i++) {
                    free(result[i]);
                }
                free(result);
                *count = 0;
                return NULL;
            }
            // 复制子字符串
            strncpy(result[index], start, length);
            result[index][length] = '\0';
            index++;
            start = end + 1; // 跳过分隔符
        }
        end++;
    }
    
    // 处理最后一段
    int length = end - start;
    result[index] = (char*)malloc((length + 1) * sizeof(char));
    if (result[index] == NULL) {
        // 内存分配失败，释放已分配的内存
        for (int i = 0; i < index; i++) {
            free(result[i]);
        }
        free(result);
        *count = 0;
        return NULL;
    }
    strncpy(result[index], start, length);
    result[index][length] = '\0';
    index++;
    
    *count = segments;
    return result;
}

/**
 * 释放split函数分配的内存
 * @param arr 字符串数组
 * @param count 数组元素数量
 */
void free_split_result(char** arr, int count) {
    if (arr == NULL) return;
    
    for (int i = 0; i < count; i++) {
        free(arr[i]);
    }
    free(arr);
}